package net.schastny.shopmanager.dao;

import java.util.List;

import net.schastny.shopmanager.dao.ContactDAO;
import net.schastny.shopmanager.domain.BaseOrder;
import net.schastny.shopmanager.domain.Contact;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

/* Repository - Аннотация показывает, что класс функционирует как репозиторий и 
 * требует наличия прозрачной трансляции исключений. Преимуществом трансляции 
 * исключений является то, что слой сервиса будет иметь дело с общей иерархией 
 * исключений от Спринга (DataAccessException) вне зависимости от используемых 
 * технологий доступа к данным в DAO слое.
 */

@Repository
public class ContactDAOImpl implements ContactDAO {
	/*Аннотация позволяет автоматически установить значение поля SessionFactory.
	 */
	@Autowired
	private SessionFactory sessionFactory;
	
	public void addContact(Contact contact) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().save(contact);
	}
	
	@SuppressWarnings("unchecked")
	public List<Contact> listContact() {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().createQuery("from Contact")
	            .list();
	}

	public void removeContact(Integer id) {
		// TODO Auto-generated method stub
		
		System.out.println("********* DELETE_DAO ************" + id);
		
		Contact contact = (Contact) sessionFactory.getCurrentSession().load(
                Contact.class, id);
		
        if (null != contact) {
            sessionFactory.getCurrentSession().delete(contact);
        }
	}

	public Contact getContact(Integer id) {
		// TODO Auto-generated method stub
		return (Contact) sessionFactory.getCurrentSession().createQuery("FROM Contact as p WHERE p.contactId="+id).uniqueResult();
	}
	

	public void editContact(Contact contact) {
		// TODO Auto-generated method stub
		
		// Retrieve session from Hibernate
		Session session = sessionFactory.getCurrentSession();
		
		// Retrieve existing person via id
		Contact existingContact = (Contact) session.get(Contact.class, contact.getContactId());
		System.out.println("existingContact = "+existingContact.toString());
		
		// Assign updated values to this person
		existingContact.setContactFirstName(contact.getContactFirstName());
		existingContact.setContactLastName(contact.getContactLastName());
		existingContact.setContactNickName(contact.getContactNickName());
		existingContact.setContactTelephone(contact.getContactTelephone());
		existingContact.setContactEmail(contact.getContactEmail());
		existingContact.setContactWarehouse(contact.getContactWarehouse());
		existingContact.setContactWarehouseNum(contact.getContactWarehouseNum());
		existingContact.setContactBalance(contact.getContactBalance());		
		existingContact.setContactProcent(contact.getContactProcent());
		existingContact.setContactDescription(contact.getContactDescription());
		// Save updates
		session.save(existingContact);
		
	}
	

}
